当使用session时,Express.js无法响应

4

这是我的应用程序:

var express = require('express'),
    app = express.createServer(),
    RedisStore = require('connect-redis')(express);

app.configure (function(){
    app.use (express.logger({ format: ":method :url" }));
    app.use (express.bodyParser());
    app.use (express.cookieParser());
    app.use (express.session({ store: new RedisStore, secret: "totally random string" }));
});
app.configure ('development', function () {
    console.log ("Development mode.");
});
app.configure ('production', function () {
    console.log ("Production mode.");
});

app.get ('/', function (req, res) {
    res.contentType("text/html");
    res.send("hello", 200);
    res.end();
})

console.log ("Listening to *:"+8006);
app.listen (8006);

当我使用localhost:8006/时,它在浏览器中挂起。
你有什么想法吗?我可能遗漏了一个小细节。当注释掉app.use (express.session...这一行时,它可以正常工作。
谢谢。

你正在使用哪个版本的Express? :) - Menztrual
1个回答

3

移除 res.end(),可以停止页面挂起并渲染页面。

var express = require('express'),
    app = express.createServer();

app.configure (function(){
    app.use (express.logger({ format: ":method :url" }));
    app.use (express.bodyParser());
    app.use (express.cookieParser());
});

app.configure ('development', function () {
    console.log ("Development mode.");
});
app.configure ('production', function () {
    console.log ("Production mode.");
});

app.get ('/', function (req, res) {
    res.contentType("text/html");
    res.send("hello");
})

console.log ("Listening to *:"+8006);
app.listen (8006);

4
为了进一步澄清,这是因为 res.send 是由 Express 添加到 Node 的 http.ServerResponse 类中的方法,而 res.end 则是本地方法。除其他外,res.send 在完成时会调用 res.end,如果在此之后自行调用 res.end,则会遇到麻烦,因为它不是设计成可以被调用两次的(事实上,在那个时间点上,响应对象可能不再有效)。 - ebohlman
谢谢。像这样结束连接,就好像没有明确地这样做一样是有意义的。为我节省了几个小时,谢谢。 - Matej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接