有人可以解释这个错误:表达式语句不是赋值或调用

时间:2017-02-08 13:52:53

标签: node.js socket.io

我有这两个代码块。

socket.on('chatMessage', function(message) {
    message.type = 'message';
    message.created = Date.now();
    message.username : socket.request.user.username;
});

socket.on('disconnect', function() {
    io.emit('chatMessage', {
        type: 'status',
        text: socket.request.user.username + ' left the conversation.',
        created: Date.now(),
        username: socket.request.user.username,
    });
});

如果我将:=更改为其他,则Webstorm会给我错误。Expression statement is not assignment or call.有人可以解释为什么会这样吗?提前谢谢。

2 个答案:

答案 0 :(得分:3)

您的第一个代码块是定义功能块。您的第二个代码块是定义对象定义。每种语法都允许使用不同的语法,您必须使用适当的语法来匹配上下文。

您的第一个代码块只是在功能块中执行一系列语句。这一行末尾的{

socket.on('chatMessage', function(message) {

定义功能块的开头。因此,Javascript正在寻找在该上下文中合法的语句。每行代码都需要一个合法的Javascript语句。和,

message.username : socket.request.user.username;
在这种情况下,

不是法律声明。如果您尝试将值分配给message.username,则其有效语法为:

message.username = socket.request.user.username;

在第二个块中,您处于对象定义的中间。这一行末尾的{

io.emit('chatMessage', {

启动对象定义。因此,在该对象上定义属性的合法语法如下所示:

username: socket.request.user.username,

所以,这里有两个关键:

  1. 识别{何时表示功能块的开始与对象定义的开始。您的第一个代码块启动一个函数体,第二个代码块启动一个对象定义。

  2. 了解功能块中允许的语法与对象定义中允许的语法之间的区别。

答案 1 :(得分:0)

没关系:

message.type = 'message';

没关系:

message.created = Date.now();

这不是:

message.username : socket.request.user.username;

应该是:

message.username = socket.request.user.username;

您的问题不明确 - 当您将:更改为=或更改之前,是否收到警告?您没有说出哪一行会导致错误,我认为它是:而不是=的那一行。

你确定你没有使用可以不同方式解释冒号的TypeScript吗?