Javascript TypeError[ERR_INVALID_ARG_TYPE]:该;“原件”;参数必须是Function类型。接收类型未定义

Javascript TypeError[ERR_INVALID_ARG_TYPE]:该;“原件”;参数必须是Function类型。接收类型未定义,javascript,node.js,typeerror,Javascript,Node.js,Typeerror,在以下代码中,我得到了此错误: TypeError[ERR_INVALID_ARG_TYPE]:“original”参数必须是Function类型。接收类型未定义 它说问题在第31行:constdbgetasync=util.promisify(db.get) $mocha src/tests/testStates.js C:\Users\Cody\AppData\Roaming\npm\node\u modules\mocha\node\u modules\yargs\yargs.js:116

在以下代码中,我得到了此错误:

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

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

$mocha src/tests/testStates.js
C:\Users\Cody\AppData\Roaming\npm\node\u modules\mocha\node\u modules\yargs\yargs.js:1163
否则就会犯错误
^
TypeError[ERR_INVALID_ARG_TYPE]:“original”参数必须是Function类型。接收类型未定义
在Object.promisify(internal/util.js:256:11)
反对。(C:\Users\Cody\Projects\goggle indexer\src\state.js:32:25)
at模块编译(内部/modules/cjs/loader.js:701:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:712:10)
at Module.load(内部/modules/cjs/loader.js:600:32)
在tryModuleLoad(内部/modules/cjs/loader.js:539:12)
at Function.Module._load(内部/modules/cjs/loader.js:531:3)
at Module.require(内部/modules/cjs/loader.js:637:17)
根据需要(内部/modules/cjs/helpers.js:22:18)
反对。(C:\Users\Cody\Projects\goggle indexer\src\tests\testStates.js:7:15)
at模块编译(内部/modules/cjs/loader.js:701:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:712:10)
at Module.load(内部/modules/cjs/loader.js:600:32)
在tryModuleLoad(内部/modules/cjs/loader.js:539:12)
at Function.Module._load(内部/modules/cjs/loader.js:531:3)
at Module.require(内部/modules/cjs/loader.js:637:17)
根据需要(内部/modules/cjs/helpers.js:22:18)
在C:\Users\Cody\AppData\Roaming\npm\node\u modules\mocha\lib\mocha.js:330:36
在Array.forEach()处
在Mocha.loadFiles(C:\Users\Cody\AppData\Roaming\npm\node\u modules\Mocha\lib\Mocha.js:327:14)
在Mocha.run(C:\Users\Cody\AppData\Roaming\npm\node\u modules\Mocha\lib\Mocha.js:804:10)
在Object.exports.singleRun(C:\Users\Cody\AppData\Roaming\npm\node\u modules\mocha\lib\cli\run helpers.js:207:16)
在exports.runMocha(C:\Users\Cody\AppData\Roaming\npm\node\u modules\mocha\lib\cli\run helpers.js:300:13)
在Object.exports.handler.argv[作为处理程序](C:\Users\Cody\AppData\Roaming\npm\node\u modules\mocha\lib\cli\run.js:296:3)
at Object.runCommand(C:\Users\Cody\AppData\Roaming\npm\node\u modules\mocha\node\u modules\yargs\lib\command.js:242:26)
在Object.parseArgs[as _parseArgs](C:\Users\Cody\AppData\Roaming\npm\node\u modules\mocha\node\u modules\yargs\yargs.js:1087:28)
在Object.parse(C:\Users\Cody\AppData\Roaming\npm\node\u modules\mocha\node\u modules\yargs\yargs.js:566:25)
在Object.exports.main(C:\Users\Cody\AppData\Roaming\npm\node\u modules\mocha\lib\cli\cli.js:63:6)
反对。(C:\Users\Cody\AppData\Roaming\npm\node\u modules\mocha\bin\u mocha:10:23)
at模块编译(内部/modules/cjs/loader.js:701:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:712:10)
at Module.load(内部/modules/cjs/loader.js:600:32)
在tryModuleLoad(内部/modules/cjs/loader.js:539:12)
at Function.Module._load(内部/modules/cjs/loader.js:531:3)
位于Function.Module.runMain(内部/modules/cjs/loader.js:754:12)
启动时(内部/bootstrap/node.js:283:19)
在bootstrapNodeJSCore(internal/bootstrap/node.js:622:3)

使用此promisify库时遇到问题。

getDB是一个返回承诺的异步函数,因此您必须等待承诺解析或链接一个
,然后使用其返回值:

//必须将其放入异步函数中
const db=等待getDB();
const dbGetAsync=util.promisify(db.get);
getDB().then(函数(db){
返回util.promisify(db.get);
}).then(函数(getFunction){
//使用get
})

在getDB()之前使用
等待
,因为它是返回承诺,所以这就是为什么会出现错误。请参见下面的更正:

const db = await getDB();
const dbGetAsync = util.promisify(db.get);
此外,您还必须将wait包装在异步函数中,否则它不会像这样工作:

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

首先不需要使用
返回dbnew Promise()中,因为它不希望回调函数返回任何值

由于getDB()是一个异步函数,因此需要将其与
wait
关键字一起使用以获取值,或者在
的处理函数中可用。然后

您多次调用
getDB()
对我来说毫无意义

最好是这样理解:与其直接将匿名函数分配给exports对象键(如exports.get=async function()
),然后从exports对象中将其用于同一文件,不如定义一个命名的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;

我之所以出现此错误,是因为我使用的是旧节点版本(8.17.0),将节点更新为新版本(12.14.0)修复了此错误。

db
似乎是一个承诺,因为
getDB
返回一个承诺,对吗?承诺没有
get
方法,所以我希望
db.get
未定义的。我怀疑你真的想做
getDB()。然后(db=>{…})
(async function(){
  let bar = await foo();
})()
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;