Безсерверный фреймворк не может использовать обещание? - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь сделать REST apis с помощью безсерверной инфраструктуры.

Некоторые функции асинхронны.

Поэтому я использую Promise.

Но обещание не работает (без ответа)

Итак, я использую ключевое слово await.Работает нормально.

Я думаю, что это плохой путь.Как использовать обещание в безсерверной среде?

Любой совет или предложение будут оценены.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 12 мая 2019

Я сейчас кодирую api без сервера и без куба для базы данных mysql world.Я должен был решить эту проблему вчера.Я пришел к следующему решению.Это не полная функция.Но ты не просил об этом.Итак, вот рабочая конечная точка 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;
0 голосов
/ 01 августа 2019

Я обычно делаю вещи с 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...
0 голосов
/ 14 марта 2019

Вы можете использовать обещание многими способами.Лично разделите обещание в другой функции.

Я сделал пример с модулем запроса:

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 в обработчик ошибок.

...