Ошибка облачной функции firebase с развертыванием N-API
Пытаемся выяснить, можно ли запускать облачные функции firebase с помощью нативного кода (с использованием N-API). У меня есть простой пример "привет, мир", который отлично работает в эмуляторе, однако, когда я пытаюсь его развернуть, я получаю ошибку 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;
}
3 ответа
Похоже, проблема была в версии механизма узла. Я переключился на node10 вместо node8, и моя тестовая функция развертывается правильно и работает должным образом.
N-API был отмечен как стабильный API, начиная с Node.js v8.6.0, поэтому, если вы используете раннюю версию среды выполнения Node.js, вы можете столкнуться с проблемами, подобными описанным здесь. Это причина того, что переход на Node.js версии 10 работает хорошо.
Я предполагаю, что проблема в том, что testaddon.hello() не возвращает обещание, поэтому ожидание его - проблема. если addon.hello () был асинхронной функцией javascript, тогда javascript обеспечил бы возврат обещания, но это функция C++.
Я раньше не использовал обещания из аддона, но это может помочь:
https://github.com/nodejs/node-addon-api/blob/master/doc/promises.md