这些与声明类型有啥区别?
Posted
技术标签:
【中文标题】这些与声明类型有啥区别?【英文标题】:What is the difference between these to declaration types?这些与声明类型有什么区别? 【发布时间】:2016-12-20 17:57:53 【问题描述】:我在 NodeJS 中使用 express 有以下代码 sn-ps: 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');
);
【问题讨论】:
【参考方案1】:在第二种情况下,app
变量最终得到 .listen()
在其中返回的内容,即 Server
对象,而不是 app 对象。因此,当您稍后尝试使用分配给app
的错误内容来执行app.use()
时,它无法正常工作。
请记住,当您像这样链接方法时:
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(...);
【讨论】:
以上是关于这些与声明类型有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章