我在NodeJS中有以下代码片段:express
1)
const app = express();
app.use('/index', function(req, res){
res.sendFile(INDEX);
})
app.listen(portno);
2)
const app = express()
.use('/index', (req, res) => res.sendFile(INDEX) )
.listen(portno);
这两者有什么区别?
为什么在第二次声明后我不能使用app.use
命令?
另外,为什么以下代码仅适用于第二个代码:
const Socket = require('ws').Server;
const server = new Socket({server: app});
server.on('connection', function(socket) {
console.log('New socket opened');
});
答案 0 :(得分:2)
在第二种情况下,app
变量最终会返回.listen()
返回的Server
对象,而不是app对象。因此,当您稍后尝试使用分配给app.use()
的错误内容执行app
时,它无法正常工作。
请记住,当您链接这样的方法时:
var x = a().b().c();
x
最终分配了链中最后一项的返回值。从技术上讲,这里发生的是a()
执行,并且在返回值上,它查找要执行的.b()
属性,然后在返回值上查找.c()
方法,然后将其返回值分配给x
。
所以,在你的情况下:
const app = express().use(...).listen(...);
app
变量将包含来自.listen()
的返回值,该值是Server
对象,而不是app
对象。并且,Server
对象没有您尝试使用它的.use()
方法。
您可以改为执行以下任一操作:
const app = express().use(...)
app.listen(...);
或者:
const app = express();
app.use(...).listen(...);
但是,如果您确实要保留app
和server
变量,那么大多数人都会这样做:
const app = express();
// define various routes and middleware
app.use(...);
app.use(...);
app.use(...);
// start the server
const server = app.listen(...);