【问题标题】:Node.js API returns JSON in terminal but not in browserNode.js API 在终端中返回 JSON,但在浏览器中不返回
【发布时间】:2016-06-17 15:32:57
【问题描述】:

有一个奇怪的问题。一直在寻找答案,但没有任何结果。我正在做一个节点 api 教程,当我执行任何 GET 请求时,它会在我的终端中从我的 mongoDB 数据库返回 JSON,但在我的浏览器或邮递员中我什么也没得到,只有在终端中我才能得到任何响应。当我在邮递员中尝试 POST 时,它说它无法连接到后端。

这是我的代码:

var http = require('http');
var url = require('url');
var database = require('./database');


// Generic find methods (GET)

function findAllResources(resourceName, req, res) {
  database.find('OrderBase', resourceName, {}, function (err, resources) {
  res.writeHead(200, {'Content-Type': 'application/json'});
  res.end(JSON.stringify(resources));
  });
};

var findResourceById = function (resourceName, id, req, res) {
  database.find('OrderBase', resourceName, {'_id': id}, function (err, resource) {
  res.writeHead(200, {'Content-Type': 'application/json'});
  res.end(JSON.stringify(resource));
  });
};

// Product methods

var findAllProducts = function (req, res) {
  findAllResources('Products', req, res);
};

var findProductById = function (id, req, res) {
  findResourceById('Products', id, req, res);
};

// Generic insert/update methods (POST, PUT)

var insertResource = function (resourceName, resource, req, res) {
  database.insert('OrderBase', resourceName, resource, function (err, resource) {
  res.writeHead(200, {'Content-Type': 'application/json'});
  res.end(JSON.stringify(resource));
  });
};

// Product methods

var insertProduct = function (product, req, res) {
  insertResource('OrderBase', 'Product', product, function (err, result) {
  res.writeHead(200, {'Content-Type': 'application/json'});
  res.end(JSON.stringify(result));
  });
};


var server = http.createServer(function (req, res) {

  // Break down the incoming URL into its components
  var parsedURL = url.parse(req.url, true);

  // determine a response based on the URL
  switch (parsedURL.pathname) {
    case '/api/products':
    if (req.method === 'GET') {
      // Find and return the product with the given id
      if (parsedURL.query.id) {
        findProductById(id, req, res)
      }
      // There is no id specified, return all products
      else {
        findAllProducts(req, res);
      }
    }
    else if (req.method === 'POST') {

      //Extract the data stored in the POST body
      var body = '';
      req.on('data', function (dataChunk) {
        body += dataChunk;
      });
      req.on('end', function () {
        // Done pulling data from the POST body.
        // Turn it into JSON and proceed to store it in the database.
        var postJSON = JSON.parse(body);
        insertProduct(postJSON, req, res);
      });
    }
    break;
    default:
    res.end('You shall not pass!');
  }
});
server.listen(8080);

console.log('Up and running, ready for action!');

【问题讨论】:

    标签: javascript json node.js api monodevelop


    【解决方案1】:
    var MongoClient = require('mongodb').MongoClient;
    
    var assert = require('assert');
    
    
    var connect = function  (databaseName, callback) {
    var url = 'mongodb://localhost:27017/' + databaseName;
    
    MongoClient.connect(url, function  (error, database) {
        assert.equal(null, error);
    
        console.log("Successfully connected to MongoDB instance!");
    
        callback(database);
    })
    };
    
    
    exports.find = function  (databaseName, collectioName, query, callback) {
    connect(databaseName, function  (database) {
        var collection = database.collection(collectioName);
    
        collection.find(query).toArray(
            function  (err, documents) {
                assert.equal(err, null);
    
                console.log('MongoDB returned the following documents:');
                console.dir(JSON.parse(JSON.stringify(documents)));
                //console.dir(documents);
                callback(null, documents);
            }
        )
    
        database.close();
    })
    };
    

    我认为我们正在学习相同的教程,这是我的“database.js”解决方案,对我有用。

    【讨论】:

      【解决方案2】:

      https://nodejs.org/api/http.html#http_response_end_data_encoding_callback

      响应结束方法不向响应套接字发送数据。也许你改变它

      res.writeHead(200, {'Content-Type': 'application/json'});
      res.end(JSON.stringify(resource));
      
      res.writeHead(200, {'Content-Type': 'application/json'});
      res.write(JSON.stringify(resource));
      res.end();
      

      如果你想让socket关闭做某事,你可以进入回调结束。

      res.end(#logHandle());
      

      【讨论】:

        【解决方案3】:

        您有几个以err 作为第一个参数的回调,但您没有处理任何潜在的错误。这意味着如果出现问题,您不会捕获它并返回错误。我不知道这是否与它有关,但作为一种做法(甚至不是“最佳”,而是一般做法)而不是这样做

        function (err, resource) {
          res.writeHead(200, {'Content-Type': 'application/json'});
          res.end(JSON.stringify(resource));
          }
        

        这样做

        function (err, resource) {
          if(err){
            // do something to warn the client and stop here
          }
          res.writeHead(200, {'Content-Type': 'application/json'});
          res.end(JSON.stringify(resource));
          }
        

        尝试一下,在尝试输出答案之前看看你是否真的遇到了错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-28
          • 2021-11-18
          • 2017-08-20
          • 1970-01-01
          • 2023-03-21
          • 1970-01-01
          相关资源
          最近更新 更多