这些与声明类型有啥区别?

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(...);

不过,如果您真的想同时保留 appserver 变量,大多数人都会这样做:

 const app = express();

 // define various routes and middleware
 app.use(...);
 app.use(...);
 app.use(...);

 // start the server
 const server = app.listen(...);

【讨论】:

以上是关于这些与声明类型有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

在C#中long与int64有啥区别吗

C语言中的.c和.cpp有啥区别?

SAP ABAP程序中这些程序类型都有啥区别呢?谢谢啦。

储蓄有啥区别?

pl/sql 中的以下声明类型有啥区别?

GORM 的“静态瞬态”和“瞬态类型 aField”声明之间有啥区别吗?