【问题标题】:TypeError [ERR_INVALID_ARG_TYPE]: The "original" argument must be of type Function. Received type undefinedTypeError [ERR_INVALID_ARG_TYPE]:“原始”参数必须是函数类型。接收类型未定义
【发布时间】:2019-10-01 20:35:13
【问题描述】:

在下面的代码中,我得到了这个错误:

TypeError [ERR_INVALID_ARG_TYPE]:“原始”参数必须是函数类型。接收类型未定义

const sqlite3 = require('sqlite3').verbose();
const util = require('util');

async function getDB() {
  return new Promise(function(resolve, reject) {
    let db = new sqlite3.Database('./project.db', (err) => {
      if (err) {
        console.error(err.message);
        reject(err)
      } else {
        console.log('Connected to the project database.');
        resolve(db)
      }
    });
    return db
  });
}


try {
  // run these statements once to set up the db
  let db = getDB();
  db.run(`CREATE TABLE services(id INTEGER PRIMARY KEY, service text, date text)`);
  db.run(`INSERT INTO services(id, service, date) VALUES (1, 'blah', '01-23-1987')`)
} catch(err) {
  console.log(err)
}


const db = getDB();
const dbGetAsync = util.promisify(db.get);

exports.get = async function(service) {

  let sql = `SELECT Id id,
    Service service,
    Date date
    FROM services
    WHERE service  = ?`;

  const row = await dbGetAsync(sql, [service], (err, row) => {
    if (err) {
      console.error(err.message);
      reject(err)
    }
    let this_row = {'row': row.id, 'service': row.service};
    this_row ? console.log(row.id, row.service, row.date) : console.log(`No service found with the name ${service}`);
    resolve(this_row)
  });

  return row;
}

let row = exports.get('blah')

它说问题在第 31 行:const dbGetAsync = util.promisify(db.get);

$ mocha src/tests/testStates.js
C:\Users\Cody\AppData\Roaming\npm\node_modules\mocha\node_modules\yargs\yargs.js:1163
      else throw err
           ^

    TypeError [ERR_INVALID_ARG_TYPE]: The "original" argument must be of type Function. Received type undefined
        at Object.promisify (internal/util.js:256:11)
        at Object.<anonymous> (C:\Users\Cody\Projects\goggle-indexer\src\state.js:32:25)
        at Module._compile (internal/modules/cjs/loader.js:701:30)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
        at Module.load (internal/modules/cjs/loader.js:600:32)
        at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
        at Function.Module._load (internal/modules/cjs/loader.js:531:3)
        at Module.require (internal/modules/cjs/loader.js:637:17)
        at require (internal/modules/cjs/helpers.js:22:18)
        at Object.<anonymous> (C:\Users\Cody\Projects\goggle-indexer\src\tests\testStates.js:7:15)
        at Module._compile (internal/modules/cjs/loader.js:701:30)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
        at Module.load (internal/modules/cjs/loader.js:600:32)
        at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
        at Function.Module._load (internal/modules/cjs/loader.js:531:3)
        at Module.require (internal/modules/cjs/loader.js:637:17)
        at require (internal/modules/cjs/helpers.js:22:18)
        at C:\Users\Cody\AppData\Roaming\npm\node_modules\mocha\lib\mocha.js:330:36
        at Array.forEach (<anonymous>)
        at Mocha.loadFiles (C:\Users\Cody\AppData\Roaming\npm\node_modules\mocha\lib\mocha.js:327:14)
        at Mocha.run (C:\Users\Cody\AppData\Roaming\npm\node_modules\mocha\lib\mocha.js:804:10)
        at Object.exports.singleRun (C:\Users\Cody\AppData\Roaming\npm\node_modules\mocha\lib\cli\run-helpers.js:207:16)
        at exports.runMocha (C:\Users\Cody\AppData\Roaming\npm\node_modules\mocha\lib\cli\run-helpers.js:300:13)
        at Object.exports.handler.argv [as handler] (C:\Users\Cody\AppData\Roaming\npm\node_modules\mocha\lib\cli\run.js:296:3)
        at Object.runCommand (C:\Users\Cody\AppData\Roaming\npm\node_modules\mocha\node_modules\yargs\lib\command.js:242:26)
        at Object.parseArgs [as _parseArgs] (C:\Users\Cody\AppData\Roaming\npm\node_modules\mocha\node_modules\yargs\yargs.js:1087:28)
        at Object.parse (C:\Users\Cody\AppData\Roaming\npm\node_modules\mocha\node_modules\yargs\yargs.js:566:25)
        at Object.exports.main (C:\Users\Cody\AppData\Roaming\npm\node_modules\mocha\lib\cli\cli.js:63:6)
        at Object.<anonymous> (C:\Users\Cody\AppData\Roaming\npm\node_modules\mocha\bin\_mocha:10:23)
        at Module._compile (internal/modules/cjs/loader.js:701:30)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
        at Module.load (internal/modules/cjs/loader.js:600:32)
        at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
        at Function.Module._load (internal/modules/cjs/loader.js:531:3)
        at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)
        at startup (internal/bootstrap/node.js:283:19)
        at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)

我在使用这个 promisify 库时遇到问题。

【问题讨论】:

  • db 似乎是一个 Promise,因为 getDB 返回一个 Promise,对吧? Promise 没有get 方法,所以我希望db.getundefined。我怀疑你真的想做getDB().then(db=&gt;{ ... })

标签: javascript node.js typeerror


【解决方案1】:

我收到此错误是因为我使用的是旧的 Node 版本 (8.17.0),将 Node 更新到较新的版本 (12.14.0) 修复了此错误。

【讨论】:

    【解决方案2】:

    首先不需要在 new Promise() 中使用return db;,因为它不期望回调函数有任何返回值。

    由于getDB()是一个异步函数,它需要与await关键字一起使用才能获取值,否则将在.then的处理函数中可用。

    您多次致电getDB() 对我来说没有意义。

    如果不是像exports.get = async function() 这样直接分配一个匿名函数来导出对象键,然后从导出对象中使用它以在同一个文件中使用,不如先定义一个命名的 get 函数,然后使用它以及导出它。

    您在 new promise() 构造函数之外使用拒绝和解析关键字,这是不可能的。

    我已经重写了你的代码,我不确定我是否遗漏了什么,但请看一下,如果你仍然遇到任何问题,请告知。

    const sqlite3 = require("sqlite3").verbose();
    const util = require("util");
    
    async function getDB() {
      return new Promise(function(resolve, reject) {
        let db = new sqlite3.Database("./project.db", err => {
          if (err) {
            console.error(err.message);
            reject(err);
          } else {
            console.log("Connected to the project database.");
            resolve(db);
          }
        });
      });
    }
    
    try {
      // run these statements once to set up the db
      let db = await getDB();
      db.run(
        `CREATE TABLE services(id INTEGER PRIMARY KEY, service text, date text)`
      );
      db.run(
        `INSERT INTO services(id, service, date) VALUES (1, 'blah', '01-23-1987')`
      );
    } catch (err) {
      console.log(err);
    }
    
    const db = await getDB();
    const dbGetAsync = util.promisify(db.get);
    
    async function get(service) {
      let sql = `SELECT Id id, Service service, Date date FROM services WHERE service  = ?`;
    
      try {
        const row = await dbGetAsync(sql, [service]);
        let this_row = { row: row.id, service: row.service };
        this_row
          ? console.log(row.id, row.service, row.date)
          : console.log(`No service found with the name ${service}`);
        return row;
      } catch (err) {
        console.error(err.message);
      }
    }
    
    let row = await get("blah");
    
    exports.get = get;
    

    【讨论】:

      【解决方案3】:

      在 getDB() 之前使用await,因为它是返回承诺,所以这就是你得到错误的原因。请参阅下面的更正:

      const db = await getDB();
      const dbGetAsync = util.promisify(db.get);
      

      您还必须将 await 包装在 async 函数中,否则它不会像这样工作:

      (async function(){
        let bar = await foo();
      })()
      

      【讨论】:

        【解决方案4】:

        getDB 是一个返回 Promise 的异步函数,因此您必须 await 才能解析或链接 then 以使用其返回值:

        // you have to put it inside an async function
        const db = await getDB();
        const dbGetAsync = util.promisify(db.get);
        
        getDB().then(function(db){
          return util.promisify(db.get);
        }).then(function(getFunction){
          // use get
        })
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-31
          • 2021-07-17
          • 2020-09-16
          • 1970-01-01
          • 2020-08-29
          • 2020-09-21
          • 2019-01-24
          相关资源
          最近更新 更多