如何使用Node和Angular在服务器和客户端之间传输数据?

时间:2016-09-22 03:56:39

标签: angularjs node.js firebase firebase-realtime-database

我有一个使用Node.js,Express,Firebase 3.4.0和Angular.js构建的应用程序。在server.js的服务器端,我初始化应用程序,然后获取users的数据库引用:

var express = require('express');
var bodyParser = require('body-parser');
var path = require('path');
var firebase = require("firebase");
var app = express();

app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(express.static(path.resolve(__dirname, 'views')));

// Firebase setup; this is where it messes up...
firebase.initializeApp({
    apiKey: "apiKey",
    authDomain: "projectId.firebaseapp.com",
    databaseURL: "https://databaseName.firebaseio.com",
    storageBucket: "bucket.appspot.com"
});
var db = firebase.database().ref();
var users = db.child('users');

app.listen(process.env.PORT, process.env.IP);

app.get('/', function (req, res) {
    res.sendfile('/views/index.html');
    // missing a statement to pass users to the view
});

现在,需要将此users引用传递给index.html,最好作为数组传递,以便在视图中操作和呈现数据。

  • 考虑到我将使用Angular,是否有可能实现这一目标?
  • 我理解模板语言会很方便,但由于服务器端和客户端都使用相同的语言,是不是一种简单而优雅的方式来让他们只传递数据
  • 这种问题的标准方法是什么?数据库的连接必须在服务器端打开,所以应该有办法,实际上有很多方法,将数据传输到客户端进行进一步操作/分解

谢谢!

1 个答案:

答案 0 :(得分:1)

首先,index.html没有业务数据,只是在DOM准备就绪时在客户端上实现AngularJS应用程序。

然后用于处理用户触发器的专用Angular service。 此服务通过使用$http GET请求向服务器请求JSON有效负载。

在服务器端,您使用新路由处理此请求:

app.get('/users', function (res, req) {
   // send the users as JSON
})

当Angular收到有效回复时,它会有用户并可以选择将它们呈现为controller

中的HTML

这次往返行程似乎很浪费,但它具有自治的优势,因此您可以在应用程序的生命周期内多次重复使用此对话框。

如果您希望在/路线上预填充用户。您需要使用服务器端模板引擎,以便在<script></script>中注入index.html,其中包含某种全局变量,其中包含客户端应用的初始状态:

<script>window.__INITIAL_STATE__ = { users: … };</script>

这个命名是任意的,它只是你选择的约定,所以Angular会知道在它启动时首先检查它。