N-API 部署的 firebase 云功能失败
firebase cloud function with N-API deployment failed
试图找出是否有可能 运行 firebase 云函数与本机代码(使用 N-API)。我有一个简单的 "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;
}
我猜问题是 testaddon.hello() 没有 return 承诺,所以等待它是一个问题。如果 addon.hello() 是一个异步 javascript 函数,那么 javascript 会确保它 return 是一个 promise,但它是一个 C++ 函数。
我以前没有使用过插件的承诺,但这可能会有所帮助:
https://github.com/nodejs/node-addon-api/blob/master/doc/promises.md
看来问题出在节点引擎的某个版本上。我已切换到 node10 而不是 node8,并且我的测试功能已正确部署并按预期工作。
N-API 从 Node.js v8.6.0 开始被标记为稳定 API 所以如果你使用早期版本的 Node.js 运行时你可能会遇到像这里报道的问题。这是因为切换到 Node.js 版本 10 一切正常。
试图找出是否有可能 运行 firebase 云函数与本机代码(使用 N-API)。我有一个简单的 "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;
}
我猜问题是 testaddon.hello() 没有 return 承诺,所以等待它是一个问题。如果 addon.hello() 是一个异步 javascript 函数,那么 javascript 会确保它 return 是一个 promise,但它是一个 C++ 函数。
我以前没有使用过插件的承诺,但这可能会有所帮助:
https://github.com/nodejs/node-addon-api/blob/master/doc/promises.md
看来问题出在节点引擎的某个版本上。我已切换到 node10 而不是 node8,并且我的测试功能已正确部署并按预期工作。
N-API 从 Node.js v8.6.0 开始被标记为稳定 API 所以如果你使用早期版本的 Node.js 运行时你可能会遇到像这里报道的问题。这是因为切换到 Node.js 版本 10 一切正常。