无服务器框架不能使用promise?

问题描述 投票:0回答:2

我正在尝试使用无服务器框架进行REST apis。

有些功能是异步的。

所以我正在使用Promise

但承诺不起作用(没有回应)

所以,我正在使用await关键字。它工作正常。

我认为这是不好的方式。如何在无服务器框架中使用promise?

任何建议或建议将不胜感激。先感谢您。

node.js typescript serverless-framework
2个回答
1
投票

您可以使用许多方式的承诺。就个人而言,将承诺与另一个职能分开。

我用请求模块做了一个例子:

const request = require("request");

// The promise
const requestPromise = (url, options) =>
    new Promise((resolve, reject) => {
        options = options || {};
        const processRequest = (err, response) => (err ? reject(err) : resolve(response));
        request(url, options, processRequest);
    });


// You can use like this
module.exports = (event,context)  => {
    let url = event.url;
    requestPromise(url)
        .then(response => {
            // Do something
            context.succeed({succeed: true /* put return data here */})
        })
        .catch(details => context.fail({error: true, details: details}));
}

// Or this
module.exports = async (event,context)  => {
    try {
        let url = event.url;
        let response = await requestPromise(url);
        // Do something
        context.succeed({succeed: true /* put return data here */});
    } catch (details) {
        context.fail({error: true, details: details});
    }
}

如果使用async / wait,则需要将try / catch添加到处理程序错误中。


1
投票

我正在为mysql world数据库编写一个无服务器无kube的api。我昨天必须解决这个问题。我到达了以下解决方案。这不是完整的功能。但你没有要求这样做。所以这是一个工作的GET端点,它接受各种查询参数来自定义查询。

'use strict';

const pool = require('./database');

module.exports.handler = async (event, context) => new Promise((resolve, reject) => {
    let request = event.extensions.request;
    let response = event.extensions.response;

    try{
        let handleResults = (err, results, fields) => {
            if(err){
                response.status(500).send({
                    success: false,
                    message: err.message,
                });
            }else{
                response.status(200).send({
                    success: true,
                    count: results.length,
                    data: results,
                });
            }
        }

        if(typeof(request.query.id) !== "undefined"){
            // search for a specific region by id
            if (Number.isNaN(Number(request.query.id))) {
                response.status(500).send({
                    success: false,
                    message: "id query param was not a number",
                });
            }

            pool.query("select id,name,code,country_id from regions where id = ?", [request.query.id], handleResults);
        }else if(typeof(request.query.country) !== "undefined"){
            // search for a region list from a specific country
            if (Number.isNaN(Number(request.query.country))) {
                response.status(500).send({
                    success: false,
                    message: "country query param was not a number",
                });
            }

            pool.query("select id,name,code,country_id from regions where country_id = ?", [request.query.country], handleResults);
        }else{
            response.status(400).send({
                success: false,
                message: "Could not find country, or region query parameter. Require a search term"
            });
        }
    }catch(exception){
        response.status(500).send({
            success: false,
            message: exception.message
        });
    }
});

和database.js:

const mysql = require("mysql");
const util = require('util');

const pool = mysql.createPool({
    connectionLimit: 10,

    host: process.env.DATABASE_HOSTNAME,
    user: process.env.DATABASE_USERNAME,
    port: process.env.DATABASE_PORT,
    password: process.env.DATABASE_PASSWORD,
    database: process.env.DATABASE_NAME,
});

pool.getConnection((err, connection) => {
    if (err) {
        if (err.code === 'PROTOCOL_CONNECTION_LOST') {
            console.error('Database connection was closed.');
        }
        if (err.code === 'ER_CON_COUNT_ERROR') {
            console.error('Database has too many connections.');
        }
        if (err.code === 'ECONNREFUSED') {
            console.error('Database connection was refused.');
        }
    }

    if (connection) connection.release();

    return;
});

// Magic happens here.
pool.query = util.promisify(pool.query);

module.exports = pool;

1
投票

我通常在无服务器项目中使用Promises:

//this would me in a module like: services/myhttpservice.js (for example)

//wrap the GET HTTP request in a Promise
module.exports.GetUrlPromise = function(url, cookie_session_value) {
    console.log(new Date().getTime() + " GetUrlPromise() CALLED: " + url);
    var j = request.jar();

    if(cookie_session_value){
         var cookie1 = request.cookie(cookie_name + '=' + cookie_session_value);
         j.setCookie(cookie1, cookie_domain);// domain used by the cookie, maybe make more generic?
    }

    // create the "Basic" auth header
    var auth = "Basic " + Buffer.from(basic_username + ":" + basic_password).toString("base64");

    //create request options
    var options = {
        'method': 'GET',
        'url': url, 
        'jar': j,
        'headers': {
        'Authorization': auth,// set Basic auth header that is the base64 of the un:pw combo
        'Content-Type': 'application/json'
    }
};

return new Promise((resolve, reject) => {
    request(options, function (error, response, body) {
        if(error){
            console.log('error:', error);   
            reject(error);      
        }else{
            console.log('statusCode:', response && response.statusCode); 

            // object for returning response results
            var http_resp = {};
            http_resp._session = GetCookieValue(response);
            http_resp.body = body;
            http_resp.statusCode = response.statusCode;
            //http_resp.response = response;
            http_resp.requestType = 'GET';

            console.log(JSON.stringify(http_resp));
            resolve(http_resp);         
        }
    });
});

}

它使我能够轻松地对我的服务进行承诺的呼叫:

 //in my controller code:

    myhttpservice.GetUrlPromise(page_url, user_session)
    .then((http_resp)=>{ etc...
© www.soinside.com 2019 - 2024. All rights reserved.