【问题标题】:Anything similar to Python Request.session() but on Node.js任何类似于 Python Request.session() 但在 Node.js 上的东西
【发布时间】:2021-01-14 07:43:50
【问题描述】:

我有一个完全用 python 编写的网络抓取应用程序。我正在网络抓取的信息在登录后面,我正在使用 Request.session 来保存登录会话。我正在尝试将代码移植到 Node.js,但无法在 Node.js 上找到类似于 request.session 的任何内容。请让我知道是否存在这样的事情。谢谢。

【问题讨论】:

  • 我想我听说过这是一个“cookie jar”,它可能取决于您使用的是哪个请求客户端?

标签: python node.js python-requests axios fetch


【解决方案1】:

最好的办法是使用axios,它允许对请求标头和身份验证类型进行广泛的自定义。

您可以添加axios-cookiejar进行cookie管理。

简单示例:

const axios = require('axios').default;
const axiosCookieJarSupport = require('axios-cookiejar-support').default;
axiosCookieJarSupport(axios);

// you can add an Authorization header to all requests:
// axios.defaults.headers.common['Authorization'] = 'Bearer token';


const cookie = 'lang=en; token=hello';

const body = {message: 'I\'m a message body'};

axios.post(url, body, {
  auth: {
    username: 'username',
    password: 'mypassword',
  },
  headers: {
    'Cookie': cookie,
    'Content-Type': 'application/json',
  },
})
  .then(res => console.log(res))
  .catch(err => console.error(err));

旧答案:

我相信默认 HTTP 服务器的 Request 对象没有你要找的东西。

但如果您选择使用 Express 框架,您可以在 express-session 包中找到类似的功能。

为了说明它的功能和简单性,以下是其文档中提供的代码示例的略微调整版本:

const express = require('express')
const parseurl = require('parseurl')
const session = require('express-session')

const app = express()

app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true,
}));

app.use((req, res, next) => {
  if (!req.session.views) {
    req.session.views = {}
  }
  // get the url pathname
  const pathname = parseurl(req).pathname;
  // count the views
  req.session.views[pathname] = (req.session.views[pathname] || 0) + 1;
  next();
});

app.get('/foo', (req, res, next) => {
  res.send('you viewed this page ' + req.session.views['/foo'] + ' times');
});

app.get('/bar', (req, res, next) => {
  res.send('you viewed this page ' + req.session.views['/bar'] + ' times');
});

app.use((req, res, next) => {
  if (res.headersSent) {
    return next();
  } else {
    console.error('Not found');
    const err = new Error('Not Found');
    err.status = 404;
    return next(err);
  }
});

app.use((err, req, res, next) => {
  console.error(req.app.get('env') === 'production' ? err.message : err.stack);
  if (res.headersSent) {
    return next(err);
  }
  res.status(err.status || 500);
  res.send(`${err.status} - ${err.message}`);
});

const http = require('http');

const server = http.createServer(app).listen(3000);

server.on('error', (e) => {
  console.log('>>> Server error');
  console.error(e);
});

console.log(`>>> Server running on localhost:3000`);

【讨论】:

  • OP 所指的requests.session 是用于http 客户端,而不是http 服务器
  • 是的,很抱歉造成混乱,但我不想启动 Node.JS express 服务器。我正在寻找在 Node.js 上保存会话的 HTTP 客户端
  • @rvaidun 哦,我的错!编辑回复以解决您的实际问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多