JavaScript ES6 - 带模板文字的console.log

时间:2017-03-30 16:03:08

标签: javascript ecmascript-6 template-literals

我正在编写连接到mongo数据库的节点脚本。

我注意到console.log语法中的小变化导致打印错误响应不同。下面的例子应该更有意义。

#!/usr/bin/env node

const mongoose = require("mongoose");
const config = require("./config");

mongoose.connect(config.dbURI, (err) => {
    if (err) {
        console.log(`${err}`); // First console.log
        console.log(err); // Second console.log
    } else {
        console.log(`Database connection successful`)
    }
});

第一个console.log

的输出示例
MongoError: Authentication failed.

第二个console.log

的输出示例
{ MongoError: Authentication failed.
    at Function.MongoError.create (/Users/sigo/Sources/crypto-change/node_modules/mongodb-core/lib/error.js:31:11)
    at /Users/sigo/Sources/crypto-change/node_modules/mongodb-core/lib/connection/pool.js:489:72
    at authenticateStragglers (/Users/sigo/Sources/crypto-change/node_modules/mongodb-core/lib/connection/pool.js:435:16)
    at Connection.messageHandler (/Users/sigo/Sources/crypto-change/node_modules/mongodb-core/lib/connection/pool.js:469:5)
    at Socket.<anonymous> (/Users/sigo/Sources/crypto-change/node_modules/mongodb-core/lib/connection/connection.js:321:22)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:191:7)
    at readableAddChunk (_stream_readable.js:178:18)
    at Socket.Readable.push (_stream_readable.js:136:10)
    at TCP.onread (net.js:563:20)
  name: 'MongoError',
  message: 'Authentication failed.',
  ok: 0,
  code: 18,
  errmsg: 'Authentication failed.' }

这种差异来自哪里?

2 个答案:

答案 0 :(得分:2)

${err}(或者'' + err)将使用字符串插入err对象,该字符串也会将Error对象更改为字符串 - 这相当于致电err.toString()。但是,直接记录err会将其作为对象传递给控制台,并以这种方式显示它。

这被称为&#34;隐含强制&#34; - 如果您想了解有关此主题的更多信息,我强烈建议您阅读You Don't Know JS: Types & Grammar (Chapter 4: Coercion)进行深入研究。

答案 1 :(得分:1)

通过在模板字符串中进行插值,err object将使用inherited来自Error.prototype.toStringconsole.log method方法强制转换为字符串。代码等同于

.toString

console.log(String(err)); console.log(err.toString()); 对象直接传递给node's inspect function时,会改为使用codepen example,代码相当于

err