我已经试了好几个小时了,都不想承认我有一个openWhisk函数来调用Compose.io上的postgre sql数据库。这是我的代码:
我最新的化身是:

function myAction(params) {
 return new Promise(function(resolve, reject) {
    console.log('Connecting to Compose database');
	// console.log('Params ---> ', params);
    var mysql = require('promise-mysql');
	var fs = require('fs');
	var pg = require('pg');
	var request = require('request')
	var Promise = require('promise/lib/es6-extensions');
	var connString = "postgres:xxxx";



	 pg.connect(connString, function(err, client, done) {
		 console.log("connectiong..", err, client, done);

          if (err) {

            console.log('[connectToCompose] failed to fetch client from pool', err);
            reject(err);

          } else {
            params.client = client; params.done = done;
            console.log('[connectToCompose] obtained a Compose client');
            return(params);

          }

		})

	//	params.client.done();
	//	console.log("closing connectiong");
 })

}

exports.main = myAction;

我有一个类似的例子,我连接到一个不同的SQL数据库(不是Compose)并使用SQL promise而不是postgre,它工作正常。我做错什么了?

最佳答案

要使用OpenWhisk和任何数据库产品,您需要使用promisified JavaScript代码;在普通nodejs中使用的事件循环是不可用的。我有一个使用pg-promise的示例(或多或少是从项目文档中获取的),它对我很好。试试这样的:

const promise = require('bluebird');

const initOptions = {
    promiseLib: promise // overriding the default (ES6 Promise);
};

const pgp = require('pg-promise')(options);
const conn_info = {...connection info...};

const db = pgp(conn_info);

module.exports.main = function main(args) {
    db.any('SELECT * FROM items')
        .then(data => {
            console.log('DATA:', data);
            // return whatever data you wanted
            resolve({message: 'success'});
        })
        .catch(error => {
            console.log('ERROR:', error);
        });
}

默认情况下,并非所有依赖项都在OpenWhisk上可用,因此在部署操作时,在zip文件中同时包含*.js文件和整个node_modules/,然后上载该文件。如果这有助于鼓励你的话,那么在OpenWhisk中使用Compose Postgres肯定是可行的:)

09-25 18:41