从 node.js 获取 bigquery 结果到浏览器

Posted

技术标签:

【中文标题】从 node.js 获取 bigquery 结果到浏览器【英文标题】:get bigquery results from node.js to browser 【发布时间】:2016-08-21 18:12:17 【问题描述】:

我正在使用 node.js 运行谷歌计算引擎但我正在使用 codeanywhere 进行测试。我可以在 codeanywhere 终端上运行 bigquery 请求,并将结果显示在终端控制台上。

但是当我尝试从 html 页面执行相同操作时,我无法将结果返回给用户/浏览器。

我在 codeanywhere 上安装的唯一节点模块是 firebase 和 googleapis。

我希望在服务器端运行 bigquery 调用,因为我想隐藏身份验证信息;否则只会从 javascript 运行 bigquery api。

我的 test.js 是:

'use strict';

var google = require('XXX/lib/googleapis');
var bigquery = google.bigquery('v2');
var authClient = new google.auth.JWT(
    'XXX@XXX.iam.gserviceaccount.com',
    'XXX.pem',
    null, ['https://www.googleapis.com/auth/bigquery']);

var request = 
    projectId: 'XXX',
    //all: true,

    auth: authClient
;

var list = bigquery.datasets.list(request, function(err, result) 
    if (err) 
        console.log(err);
     else 
        console.log(result);
        return result;
    
);

我的 html 是:

<!DOCTYPE html>
    <html lang = "en">

    <head>
    <title>Testing Server Call </title> 
    <script type = "text/javascript" src = "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" ></script> 
    <script type = "text/javascript" >
    $(function() 
        $.ajax(
            type: 'GET',
            url: 'test.js'
            success: function(data) 
                console.log('yay');
                console.log(data);              
            ,
            error: function(xhr, status, error) 
                console.log('Error: ' + error.message);
            
        );


    );

</script> 
</head>
<body>
    hi there

</body>
</html>

我已经搜索和测试了过去几天,但不知道我缺少什么。我不断收到错误消息,例如:Error: require is not defined,而且我找不到任何教程来帮助我完成完成此任务的步骤。提前感谢您的帮助。

【问题讨论】:

你可以尝试在“use strict”之前保留require语句吗? 谢谢。试过了,还是报错'require is not defined' @jm93 您是否在浏览器或节点控制台中遇到 require 错误? @owaishanif786 节点控制台工作正常,浏览器出错,谢谢 require 永远不会在浏览器中工作。所以你必须使用 node.js 控制台。要运行它以在浏览器中使用 require ,您必须使用 browserify.org 或 webpack。 【参考方案1】:
'use strict';
var http = require('http');
var google = require('XXX/lib/googleapis');
var bigquery = google.bigquery('v2');
var authClient = new google.auth.JWT(
    'XXX@XXX.iam.gserviceaccount.com',
    'XXX.pem',
    null, ['https://www.googleapis.com/auth/bigquery']);

var request = 
    projectId: 'XXX',
    //all: true,

    auth: authClient
;



var server = http.createServer(function(req, res)
    var list = bigquery.datasets.list(request, function(err, result) 
        if (err) 
            console.log(err);
         else 
            console.log(result);
            response.end(result);
        
    );
);
server.listen(8080, function());

在前端,您必须指定要发出请求的路线

<!DOCTYPE html>
    <html lang = "en">

    <head>
    <title>Testing Server Call </title> 
    <script type = "text/javascript" src = "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" ></script> 
    <script type = "text/javascript" >
    $(function() 
        $.ajax(
            type: 'GET',
            url: 'http://localhost:8080/'
            success: function(data) 
                console.log('yay');
                console.log(data);              
            ,
            error: function(xhr, status, error) 
                console.log('Error: ' + error.message);
            
        );


    );

</script> 
</head>
<body>
    hi there

</body>
</html>

之后你必须在命令行node test.js运行

【讨论】:

感谢您的快速帮助!我目前正在测试。我确实忘记提及我的生产端是谷歌计算引擎,但我正在使用 codeanywhere 工作区进行测试。希望没关系 不幸的是,在浏览器控制台中仍然收到“错误:未定义要求”,具体而言。如果我使用 localhost:8080 作为路由,我会得到“连接被拒绝” - 这是使用 codeanywhere 作为我的测试环境 谢谢,尝试了答案中的编辑代码。同样的错误。猜这是不可能的。感谢您的帮助。看来我必须付钱给某人,因为 *** 并不是真正为我需要的帮助而设计的。【参考方案2】:

在这里,您使用 test.js 作为在客户端加载 js 的 url。您不能在客户端使用 require ,此错误也是如此。您应该创建一条路线并将其提供给那里。

【讨论】:

这部分让我感到困惑。 test.js 在服务器上,为什么它在客户端“加载”? test.js 在终端中运行良好,但将数据发送到浏览器却让我很头疼。不知道我错过了什么。 你写的ajax调用相当于jQuery.getScript();它用于在客户端加载脚本。 什么是可以工作的等效语法?我只想在服务器端获取 bigquery 结果并发送到浏览器。 您必须遵守@owaisshahhanif786 的建议。 Ajax 调用将有一个路由。在你的系统节点服务器应该通过键入 node test.js 来启动本地服务器。当您的节点服务器未启动时,可能会出现连接拒绝错误。 谢谢。我在终端中再次运行了“node test.js”。我在终端中收到服务器控制台消息,但是当我刷新 html 页面时,仍然被拒绝连接。

以上是关于从 node.js 获取 bigquery 结果到浏览器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 node.js 环境中将查询语句传递给 bigquery

node.js 从 mysql 查询中获取结果

如何使用 node.js MySQL 从 MySql DB 获取结果并将它们发送回 API.ai - DialogFlow

Firebase 函数 Node.js 转换流

如何在Node.js中执行IO任务序列[重复]

如何使用 Node.js 控制 Cloud PubSub 中的确认