0

试图找出是否可以使用本机代码(使用 N-API)运行 firebase 云功能。我有一个简单的“hello world”示例,它在模拟器下运行良好,但是当我尝试部署它时,我收到 INVALID_ARGUMENT 错误:

  status: {
   code:  3     
   message:  "INVALID_ARGUMENT"     
  }

这不是很丰富......只是想知道是否有人可以阐明这种情况。谢谢!

这是功能:

'use strict';

const functions = require('firebase-functions');

exports.helloWorld = functions.https.onRequest(async(request, response) => {

console.time('Program runtime');

const testAddon = require('bindings')('testaddon.node')
const {promisify} = require('util');

module.exports = testAddon;
const asyncCommand = testAddon.hello();

try {
  const result = await asyncCommand;
  console.log('CONTENT:', result);
  response.send(result);
}
catch (err) {
    console.log('ERROR:', err);
    response.send('ERROR:', err);
}

console.timeEnd('Program runtime');
});

和相应的 C++ 源代码:

#include <napi.h>
namespace functionexample {
  std::string hello();
  Napi::String HelloWrapped(const Napi::CallbackInfo& info);
  Napi::Object Init(Napi::Env env, Napi::Object exports);
}
#include "functionexample.h"
std::string functionexample::hello(){
  return "Hello World";
}
Napi::String functionexample::HelloWrapped(const Napi::CallbackInfo& info)
{
  Napi::Env env = info.Env();
  Napi::String returnValue = Napi::String::New(env, functionexample::hello());

  return returnValue;
}
Napi::Object functionexample::Init(Napi::Env env, Napi::Object exports)
{
  exports.Set(
"hello", Napi::Function::New(env, functionexample::HelloWrapped)
  );

  return exports;
}
4

3 回答 3

0

我猜问题是 testaddon.hello() 没有返回承诺,所以等待它是一个问题。如果 addon.hello() 是一个异步 javascript 函数,那么 javascript 会确保它返回一个 Promise,但它是一个 C++ 函数。

我以前没有使用过插件的承诺,但这可能会有所帮助:

https://github.com/nodejs/node-addon-api/blob/master/doc/promises.md

于 2020-02-20T11:20:25.753 回答
0

似乎问题出在节点引擎的版本上。我已经切换到 node10 而不是 node8 并且我的测试功能正确部署并按预期工作。

于 2020-02-21T16:23:44.150 回答
0

N-API 已被标记为从 Node.js v8.6.0 开始的稳定 API,因此如果您使用 Node.js 运行时的早期版本,您可能会遇到此处报告的问题。这是因为切换到 Node.js 版本 10 一切正常。

于 2020-03-09T11:25:08.000 回答