Node.js API在终端中返回JSON,但在浏览器中不返回

问题描述:

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

这里是我的代码:

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!'); 

你有几个回调与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)); 
    } 

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

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()); 

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”的解决方案,为我工作。