对JavaScript / nodejs中的'use strict'感到困惑

时间:2015-09-29 15:49:48

标签: javascript node.js

当我在代码中添加了一个linter时,我注意到我在'use strict';上遇到了很多错误,所以我将这行加到了很多文件中。但是这打破了我的主app.js文件中的一些代码,如下所示:

'use strict';

var express = require('express');
var timeout = require('connect-timeout');
//var logger = require('morgan');
var requireDir = require('require-dir');
var app = express();

// Load all the routes in the routes file into app middleware
// This assumes that the route exports an express.Router() object
var routes = requireDir('./routes');
for (var i in routes) app.use('/', routes[i]);


// Set the timeout
app.use(timeout('5s'));

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = 'ERROR: Invalid request to the server';
  err.status = 404;
  next(err);
});

if (!module.parent) {
  app.listen(3000);
  console.log('engine-map-service opend on port 3000');
}

返回以下error堆栈:

  TypeError: Cannot assign to read only property 'status' of ERROR: Invalid request to the server
     at /usr/src/app/app.js:21:14
     at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
     at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:312:13)
     at /usr/src/app/node_modules/express/lib/router/index.js:280:7
     at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:330:12)
     at next (/usr/src/app/node_modules/express/lib/router/index.js:271:10)
     at /usr/src/app/node_modules/connect-timeout/index.js:64:5
     at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
     at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:312:13)
     at /usr/src/app/node_modules/express/lib/router/index.js:280:7 

究竟是什么use strict?我已经阅读了一些文章,我没有看到任何关于如何改变我作为开发人员的行为以及何时应该或不应该使用它的深入思考。我发现有多篇文章建议使用js启动每个use strict文件,但显然有些情况我不知道。

1 个答案:

答案 0 :(得分:2)

What does "use strict" do in JavaScript, and what is the reasoning behind it? 广泛涵盖use strict的使用。

在您的特定情况下,它会捕获TypeError,否则在运行时发生某种情况之前不会抛出err

在错误处理程序中,您正在创建一个名为app.use(function(req, res, next) { var err = { message: 'ERROR: Invalid request to the server', status: 404 }; next(err); }); 的字符串,然后尝试为其分配属性。您无法将属性分配给字符串。

如果要创建包含消息和状态的错误对象,可以执行以下操作:

{{1}}