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

时间:2019-05-14 18:53:19

标签: javascript node.js typeerror

在以下代码中,出现此错误:

  

TypeError [ERR_INVALID_ARG_TYPE]:“原始”参数必须为Function类型。收到的类型未定义

Q

它说问题出在第31行: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')

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

我在使用这个Promisify库时遇到问题。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:4)

我收到此错误是因为我正在使用旧版本的Node(8.17.0),将Node更新到较新的版本(12.14.0)可以解决此错误。

答案 1 :(得分:3)

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
})

答案 2 :(得分:3)

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

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

此外,您还必须将await包装在异步函数中,否则它将无法正常工作:

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

答案 3 :(得分: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;