【问题标题】:NodeJS/ExpressJS/MongoDB Simple API ErrorsNodeJS/ExpressJS/MongoDB 简单 API 错误
【发布时间】:2018-03-12 01:29:10
【问题描述】:

我正在尝试使用 NodeJS/ExpressJS 和猫鼬制作一个简单的 API。

我收到错误消息:No default engine was specified and no extension was provided

API 将调用 cat API。由于它只支持XML,所以它会先转换成JSON,然后再插入到mongoDB中,然后返回给客户端的JSON会以一种非常具体的方式进行格式化。目前,我遇到了问题。谁能告诉我怎么了?

var express = require('express');
var router = express.Router();

var mongoose = require('mongoose');
var History = mongoose.model('History');
var request = require("request");
var convert = require('xml-js');
const util = require('util')

router.get('/cat', function(req, res, next) {
    var url = "http://thecatapi.com/api/images/get?format=xml&type=jpg"
    var result = request.get(url, function (error, response, body) {
        return body;
    });

    var options = {ignoreComment: true, alwaysChildren: true, compact: true};
    var result_get = convert.xml2js(result, options);

var image = result_get['response']['data']['images']['image']
var url_data = image['url']['_text']
var id_data = image['id']['_text']
var source_url_data = image['source_url']['_text']

console.log(
    id_data ,
    url_data ,
    source_url_data 
);

var history = new History()
//hardcode user for now
history.user = "1"
history.url = url_data 
history.id = id_data 
history.source_url = source_url_data 
history.save(function(err, history){
    if(err) {
        return res.send(500,err);
    }
    var history_json= res.json(history);
    var returned_json = {}
    var key = 'image'
    returned_json[key] = {}
    var data = {
        url: url_data,
        id: id_data,
        source_url: source_url_data
    }

    returned_json[key] = data
    console.log(JSON.stringify(returned_json))

    return res.json(returned_json);

    });
});


module.exports = router;

返回的 JSON 应该如下所示:

{
  "image": {
    "url": "http://24.media.tumblr.com/tumblr_m3ay3e1zHp1qcxyrro1_1280.jpg",
    "id": "c11",
    "source_url": "http://thecatapi.com/?id=c11"
  }
}

【问题讨论】:

  • 你在console 中得到了什么?
  • 这里有很多事情要做。您的大部分代码都在您的 request 回调之外,这意味着它将在回调发生之前执行。我建议退后一步,一次只做一件事。

标签: javascript json node.js mongodb express


【解决方案1】:

您不需要视图引擎,因为您只是在编写一个只返回 JSON 响应的后端服务器。在您的 index.js 文件(或您的服务器正在运行的任何地方)中,注释掉以下行。

app.set('view engine', 'html');

【讨论】:

    【解决方案2】:

    您描述的错误可能与您发布的代码无关,因为您没有渲染任何内容。但似乎在您的应用程序的某个地方使用res.render。如果是这种情况 - 您将需要设置视图引擎。

    Re,您发布的代码:

    1)。您不能从 request.get 中传递的 callback 函数内部返回正文。 body 仅在回调函数中定义,您必须将其余代码包装在此回调函数中。或者,您也可以将其余代码封装在一个函数中,并在 callback 函数中调用它:

    request.get(url, function (error, response, body) {
        handleRes(body);
    });
    
    function handleRes(result){
    /*.. the rest of your code goes here */
    }
    

    2)。一旦你调用了res.send,你就不能再次调用它,因为res.send结束了响应。

    【讨论】:

    • 谢谢,这就是我最终这样做的方式。我只是想让代码不那么混乱。回调中的回调看起来很丑。
    • 如果你愿意,可以使用Promise
    • 我正在考虑这个问题,但我必须重新编写所有内容。也许我会。谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-11-19
    • 2016-07-22
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多