首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将外部Json快速呈现给玉器

将外部Json快速呈现给玉器
EN

Stack Overflow用户
提问于 2015-03-06 08:54:34
回答 2查看 3.6K关注 0票数 1

我有一个文件(api.js),当我使用node.js调用终端时,它会给出一个工作的JSON响应。我已经使用请求-承诺做http请求和应用程序是一个快车样板。

现在,我想将这个响应添加到Jade文件中,并让Jade迭代JSON结果。

我怎样才能使用这个文件,然后把它传递给玉石呢?

其次,我如何在Jade中获得一个按钮来使用相同的api执行POST请求,或者前端如何调用后端并在前端显示结果?

下面是我的api文件api.js:

代码语言:javascript
复制
var rp = require('request-promise');

var initGet = {
  uri: 'http://www.jsonapi.com/get',
  method: 'GET',
  headers: {"Content-Type": "application/json"}
};

var initPost = {
  uri: 'http://www.jsonapi.com/post',
  method: 'POST',
  headers: {"Content-Type": "application/json"},
  data: {},
  resolveWithFullResponse: true
};

var apiCall = function apiCall(options) {
// if request is GET
  if (options.method === 'GET') {
    rp(options)
      .then(function (res) {
        /// I assume this is where the response is sent to jade
      })
      .catch(console.error);
  }
// if request is POST
  else {
    rp(options)
      .then(function (res) {
        /// I assume this is where the response is sent to jade
      })
      .catch(console.error);
  }
};

var apiGet = function apiGet() {
  apiCall(initGet);
};

var apiPost = function apiPost(input) {
  initPost.data = input;
  apiCall(initPost);
};

// example of data in POST
apiPost({
  user: 2,
  event: 'World Cup 2018',
  name: 'Brazil'
});

module.exports = {
  apiGet: apiGet,
  apiPost: apiPost
};

在玉器档案里我有:

代码语言:javascript
复制
extends layout
block content
  .title
    h1
      | App
  .ui
    each val in res
    .ui_box
      .ui_box__inner
        .event
          span val.event
        .name
          span val.name
      .drop
        p show drop down
        .arrow
    .ui_box.dropdown
      .submit-button
        p submit
        //submit POST
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-10 16:11:41

这是我的解决方案,经过多次尝试和错误!

我继续使用请求作为对外部jSON api的http调用。

api.js:

代码语言:javascript
复制
var request = require('request'); // require in request
var initGet = {uri: 'http://linkToApi.com/get'};
var initPost = {uri: 'http://http://linkToApi.com/post'};

var apiCaller = function (url, cb) {
  //use request to make the external http call to the JSON api
  request({
    url: url,
    json: true
  }, function (error, response, body) {

    if (!error && response.statusCode === 200) {
      cb(body);// Send body/response to callback
    }
  })
};
// Call the api with a call back
var apiGet = function(cb) {
  return apiCaller(initGet.uri, cb);
};

var apiPost = function(post, cb) {
  return apiCaller(initGet.uri + post, cb);
};
// Export the functions for external access
module.exports = {
  apiGet: apiGet,
  apiPost: apiPost
};

现在是特快路线:

代码语言:javascript
复制
var api = require('./api');
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  //call the api apiGet and create callback function
  api.apiGet(function (data) {
    // render to the index.jade and pass the data from api call
    res.render('index', { result :data});
  });
});

最后,在index.jade文件中:

代码语言:javascript
复制
block content
  .ui
//*** make sure the indentation is correct 'for' otherwise it doesn't parse!!
    for data in result //iterate through the results
      .ui_box
        .ui_box__inner
          .event
            span #{data.event} // here pick out the jSON you require
          .name
            span #{data.name}
票数 3
EN

Stack Overflow用户

发布于 2015-03-06 10:01:37

我不能百分之百肯定我是否完全理解你的问题,但我会试一试。

你不会像你说的那样“快速地使用这个文件,然后把它传递给翡翠”,你只会把一个带有一些数据的玉石文件呈现给服务器。如果你愿意的话,这个请求可以使用你的模块,但是用这种方式来解释它背后的概念是有帮助的。

有关如何使用特快模板引擎的信息,请阅读以下内容:http://expressjs.com/guide/using-template-engines.html

您的端点将如下所示:

代码语言:javascript
复制
var yourModule = require('./modules/yourModuleFile'); //note you don't need .js

app.get('/', function (req, res) {
  yourModule.apiGet().then(function(result){
    res.render('yourTemplate', result);
  })
})

写完这个例子后,我想您可能对如何实际使用承诺有一个稍微不同的想法。在你的模块中,你不会“做工作”,你会“用结果来解决问题的承诺”。

如果你需要更多关于最后一点的解释,请告诉我,我会扩展我的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28895237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档