【问题标题】:JavaScript ES6 - console.log with template literalJavaScript ES6 - 带有模板文字的 console.log
【发布时间】:2017-03-30 16:03:08
【问题描述】:

我正在编写连接到 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.' }

这种差异从何而来?

【问题讨论】:

    标签: javascript ecmascript-6 template-literals


    【解决方案1】:

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

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

    【讨论】:

    • 哇。这很聪明。感谢您的链接!我什至现在知道 JavaScript 如何选择从对象中提取的值。
    【解决方案2】:

    通过在模板字符串中插值,err object 被转换为字符串,使用其自己的 .toString 方法,即来自 Error.prototype.toStringinherited。代码相当于

    console.log(String(err));
    console.log(err.toString());
    

    当将err对象直接传递给console.log method时,它使用node's inspect function代替,代码相当于

    console.log(util.inspect(err));
    

    【讨论】:

      猜你喜欢
      • 2017-11-19
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      相关资源
      最近更新 更多