javascript - express请求成功但是会报错:`can't set headers after they are sent`?
大家讲道理
大家讲道理 2017-04-11 11:40:30
[JavaScript讨论组]

我使用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}`);
});

报错信息

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(3)
高洛峰

已重现。
问题原因:

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;的位置

PHP中文网
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();后面。

伊谢尔伦

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号