express请求成功但是会报错:`can't set headers after they are sent`?

发布于 2022-09-04 11:26:14 字数 3394 浏览 14 评论 0

我使用express作为后台提供接口,然后在在本地开了另一个端口跨域获取数据。
现在的情况是,请求都可以成功,不过后台会报错:
can't set headers after they are sent

我使用的是cors模块解决跨域问题。

接口方法

const sha1 = require('sha1');
const UserModel = require('../../models/users');

exports.getUser = function (req, res) {
  var email = req.fields.email;
  var password = req.fields.password;

  UserModel.getUserByEmail(email)
    .then(function (user) {
      if (!user) {
        return res.send({error: '用户不存在'});
      }
      // 检查密码是否匹配
      if (sha1(password) !== user.password) {
        return res.send({error: '用户名或密码错误'});
      }
      // 用户信息写入 session
      delete user.password;
      req.session.user = user;
      res.json(user);
    })
    .catch(function(err) {
      // next();
      return res.send(err);
    });
}

这是一个删除接口

/**
 * 根据ID删除文章
 * @param  {[type]} req [description]
 * @param  {[type]} res [description]
 * @return {[type]}     [description]
 */
exports.delPostById = function (req, res, next) {
  var postId = req.params.postId;
  PostModel.deletePostById(postId)
    .then(function (posts) {
      return res.json({success:true,massage:'删除成功'});
    })
    .catch(function(err) {
      // next();
      return next(err);
    });
}

index.js

var path = require('path');
var express = require('express');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var flash = require('connect-flash');
var config = require('config-lite');
var cors = require('cors');
var routes = require('./routes');
var pkg = require('./package');

var app = express();

// 设置模板目录
app.set('views', path.join(__dirname, 'views'));
// 设置模板引擎为 ejs
app.set('view engine', 'ejs');

// 设置静态文件目录
app.use(express.static(path.join(__dirname, 'public')));

// session 中间件
app.use(session({
  name: config.session.key,// 设置 cookie 中保存 session id 的字段名称
  secret: config.session.secret,// 通过设置 secret 来计算 hash 值并放在 cookie 中,使产生的 signedCookie 防篡改
  cookie: {
    maxAge: config.session.maxAge// 过期时间,过期后 cookie 中的 session id 自动删除
  },
  store: new MongoStore({// 将 session 存储到 mongodb
    url: config.mongodb// mongodb 地址
  })
}));
// flash 中间价,用来显示通知
app.use(flash());

// 处理表单及文件上传的中间件
app.use(require('express-formidable')({
  uploadDir: path.join(__dirname, 'public/img'),// 上传文件目录
  keepExtensions: true// 保留后缀
}));

// 设置模板全局常量
app.locals.blog = {
  title: pkg.name,
  description: pkg.description
};
// 添加模板必需的三个变量
app.use(function (req, res, next) {
  res.locals.user = req.session.user;
  res.locals.success = req.flash('success').toString();
  res.locals.error = req.flash('error').toString();
  next();
});
// 这样在调用 res.render 的时候就不用传入以上这三个变量了,express 为我们自动 merge 并传入了模板,所以我们可以在模板中直接使用这四个变量。

var corsOptions = {
  origin: 'http://localhost:8080',
  optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204
}
app.use(cors(corsOptions));

// 路由
routes(app);

// 监听端口,启动程序  supervisor
app.listen(config.port, function () {
  console.log(`${pkg.name} listening on port ${config.port}`);
});

报错信息
图片描述

我在网上搜了好久,都没解决,想问问大家我应该从哪边入手解决?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

兔姬 2022-09-11 11:26:14

已重现。
问题原因:

express-session是在response的header里加入了形如——

'set-cookie': [ 'connect.sid=s%3AoHHkUAxn0Yq8uUspO8O8ozCpxuuczikR.pyvLwEgGwZjP0k%2BhFPkvueFmSErjCGGTYKpEJuHIDEw; Path=/; Expires=Tue, 03 Jan 2017 07:08:18 GMT; HttpOnly' ]

的内容,所以触发了Express的这个错误。

改进方法:

调整delete user.password;req.session.user = user;的位置

前事休说 2022-09-11 11:26:14
app.use(function (req, res, next) {
  res.locals.user = req.session.user;
  res.locals.success = req.flash('success').toString();
  res.locals.error = req.flash('error').toString();
  next();
});

把这几行代码放到,var app = express();后面。

clipboard.png

安人多梦 2022-09-11 11:26:14

遇到一样的问题、楼主解决了么

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文