云函数返回RequestError:错误:套接字挂起

时间:2018-04-21 02:10:56

标签: firebase nodes google-cloud-functions onesignal

我使用云功能连接信号服务,将向用户发送通知。在本地测试功能之后,它完美地工作但是在部署到云功能之后它返回一个错误“RequestError:Error:read ECONNRESET”,我把云函数重置为重置连接

这是我的代码看起来像

exports.sendNotification = functions.pubsub.topic('cron-notification').onPublish(async (message) => {
const databaseRef = admin.database();
// Query all user from realtime db
const snapshotsUser = await databaseRef
    .ref(`user`)
    .orderByKey()
    .once("value");

// Check if user exist
if (snapshotsUser) {
    //Get the user key
    const user_object_key = Object.keys(snapshotsUser.val());

    // send notification for each user
    user_object_key.map(async (user_id) => {
        // query something
    const snapshotsUser = await databaseRef
    .ref(`record/user_id`)
    .orderByKey()
    .once("value");
        const message = {
            "app_id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
            "filters": [
                {"field": "tag", "key": "user_id", "value": user_id}
            ],
            "headings":  {"en": `Hello World`},
            "contents": {"en": `Hello`}
        }
    sendNotification(message);
})}});

function sendNotification(message) {
const headers = {
    "Content-Type": "application/json; charset=utf-8",
    "Authorization": "Basic XXXXXXXXXXXXXXXXXXXXXXXXXXX"
};

// Use onesignal for send notification
const options = {
    uri: "https://onesignal.com/api/v1/notifications",
    headers: headers,
    method: 'POST',
    json: true,
    body: message,
    resolveWithFullResponse: true,
}

return request(options).then(response => {
    if (response.statusCode >= 400) {
        throw new Error(`HTTP Error: ${response.statusCode}`);
    } else {
        console.log(response.body)
    }
}).catch(error => {
    console.log(error);
})}

有人能为我提出建议吗?

2 个答案:

答案 0 :(得分:0)

根据Node.js documentation'ECONNRESET'错误发生在对等方强行关闭连接时。由于超时或重新启动,这会导致远程套接字上的连接丢失。由于您提到代码在本地工作并且在部署之后发生错误,here是一个答案,它说可能的解决方案是增加内核数量,以便更快地处理请求。另外,阅读关于socket hang up错误的GitHub讨论可能会有用。

答案 1 :(得分:0)

仅对于遇到与我相同的问题的人,我只是注意到我没有在函数中返回任何内容。如果未返回任何内容,cloud函数将重置该函数。因此,从上面的代码来看,应该像这样,并且一切正常。

exports.sendNotification = functions.pubsub.topic('cron-notification').onPublish(async (message) => {
const databaseRef = admin.database();
// Query all user from realtime db
const snapshotsUser = await databaseRef
    .ref(`user`)
    .orderByKey()
    .once("value");

// Check if user exist
if (snapshotsUser) {
    //Get the user key
    const user_object_key = Object.keys(snapshotsUser.val());

    // send notification for each user
    return Promise.all([    user_object_key.map(async (user_id) => {
        // query something
    const snapshotsUser = await databaseRef
    .ref(`record/user_id`)
    .orderByKey()
    .once("value");
        const message = {
            "app_id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
            "filters": [
                {"field": "tag", "key": "user_id", "value": user_id}
            ],
            "headings":  {"en": `Hello World`},
            "contents": {"en": `Hello`}
        }
    sendNotification(message);
})])}});

function sendNotification(message) {
const headers = {
    "Content-Type": "application/json; charset=utf-8",
    "Authorization": "Basic XXXXXXXXXXXXXXXXXXXXXXXXXXX"
};

// Use onesignal for send notification
const options = {
    uri: "https://onesignal.com/api/v1/notifications",
    headers: headers,
    method: 'POST',
    json: true,
    body: message,
    resolveWithFullResponse: true,
}

return request(options).then(response => {
    if (response.statusCode >= 400) {
        throw new Error(`HTTP Error: ${response.statusCode}`);
    } else {
        console.log(response.body)
    }
}).catch(error => {
    console.log(error);
})}