求助,难了我好几天了。 Can't set headers after they are sent.

阿木木
  • 196

app.js

var express = require('express');
var path = require('path');
var config = require("./config");// 处理配置文件
var session = require("express-session");// 处理session cookie
var MongoStore = require('connect-mongo')(session);// 将session存到mongoDB
var formidable = require("express-formidable");// 解析提交内容
var postRoutes = require("./router/postRoutes");
var apiRoutes = require("./router/apiRoutes");

var app = express();

app.set(express.static(path.join(__dirname,"/public")));
app.set("views",path.join(__dirname,"/public"));
app.set("view engine","ejs");
// 中间件session
app.use(session({
    name:config.session.key,
    secret:config.session.secret,
    cookie:{
        maxAge:config.session.maxAge
    },
    store:new MongoStore({
        url:config.mongodb
    })
}));

// 中间件formidable解析form提交
app.use(formidable({
    uploadDir:path.join(__dirname,"public/avatar"),// 头像路径
    keepExtensions:true// 保留后缀
}));

app.use("/post",postRoutes);
app.use('/api',apiRoutes);


app.listen(3000,function(){
    console.log("listen on port 3000 ******************");
})

postRouter

var express = require('express');
var path = require("path");
var sha1 = require('sha1');
var postModel = require('../model/db').postModel;
var groupModel = require('../model/db').groupModel;
var moment = require('moment');
var marked = require('marked');

var postRoutes = express.Router();
var Err = 0;
var OK = 1;
// 主页
postRoutes.get('/posts',function(req,res){
    postModel.find({},function(err,posts){
        if (err) {
            res.json({'style':Err});
            return;
        }
        res.json({'style':OK,"posts":posts});
        console.log('/posts');
        // return;
    });
});

apiRouter

var express = require('express');
var userModel = require('../model/db').userModel;
var groupModel = require('../model/db').groupModel;
var apiRoutes = express.Router();

const Err = 0;
const OK = 1;

apiRoutes.get('/userInfo',function(req,res){
    userModel.findOne({name:'哈哈'},function(err,user){

        res.json({
            'style': OK,
            'user':user
        })
        console.log('/userInfo');
    })
});

module.exports = apiRoutes;

不是永远报错,是有时会报这个错误。我删的就剩这两个了,还是会报错;
错误的意思我知道,return 的位置写错了么?
请教应该怎么写?
出现好几天了,我试了很多方法,求一语道破。

回复
阅读 2.1k
5 个回答

问题解决了!

var formidable = require("express-formidable");// 解析提交内容

这个插件抽风,换成bodyparser来解析就没问题了,谢谢各位了。

apiRouter里,get方法里多了个return,把这个return去掉

`
return res.json({

   'style': OK,
   'user':user

})`

错误在这:

clipboard.png

一个请求只能有一次响应,res不能执行两次,这是我踩过的坑,希望能帮助你

首先你抛出的这个异常是指在你向客户端返回response之后,又设置header的错误。这个设置一般发生在http相关的模块。你上面的代码没有一行是关于设置response header的。
然后你说时有时无的错误是哪个错误?标题里面的吗?
你访问的请求又是哪一个?

提醒一下。res.json()实际行是调用的res.send(),而,res.send()是依赖于res.end()的,所以res.json()下面的代码是不执行的。
可以参考express官方文档:http://www.expressjs.com.cn/4...

宣传栏