【问题标题】:Simple way of client-server communication in NodeJSNodeJS中客户端-服务器通信的简单方法
【发布时间】:2016-05-14 19:31:48
【问题描述】:

我发现了一个非常有用的代码 sn-p on GitHub,它可以在 NodeJS 中提供简单的服务器-客户端通信。

经过一些小的格式化后,我的代码如下所示:

客户端(Jade + Javascript)

head
    title jsonp test
    script(src='http://code.jquery.com/jquery-1.6.2.min.js')
    script(type='text/javascript').

    $(function () {
        $('#select_link').click(function (e) {
            e.preventDefault();
            console.log('select_link clicked');

            var data = {};
            data.title = "title";
            data.message = "message";
            $.ajax({
                type: 'POST',
                data: JSON.stringify(data),
                contentType: 'application/json',
                url: 'http://localhost:7776/domaintest',
                success: function (data) {
                    console.log('success');
                    console.log(JSON.stringify(data));
                }
            });
        });
    });

body
    #select_div
        a#select_link(href='#') Test

服务器(Javascript)

var express = require('express');
var app = express.createServer();

app.use(express.bodyParser());

app.post('/domaintest', function(req, res){
    var obj = {};
    console.log('body: ' + JSON.stringify(req.body));
    res.send(req.body);
});

app.listen(7776);

定义给客户端的路由(有人告诉我这对于服务器来说是不必要的,因为app.post 可以达到目的)

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

router.get('/', function(req, res, next) {
    res.render('index');
});

module.exports = router;

结果是一个简单的文本“测试”,可以点击。当我点击时,实际事件应该发生在我从代码中读出的情况下,但安装的浏览器在jquery-1.6.2.min.js:18 中显示POST http://localhost:7776/domaintest 404 (Not Found)。准确地说,错误发生在$.ajax,根据调试器。

由于格式的原因,jQuery 代码实际上是不可读的(不是判断,它可能有它的原因),我需要你的帮助。错误的可能来源是什么?我忘了提什么吗?

【问题讨论】:

  • 当您浏览http://localhost:7776/domaintest时会发生什么?你的应用在监听吗?
  • @cale_b domaintest 实际上是空的。它由一个带有一些小文本的 Jade 页面、没有附加的 JS 脚本和一个路由(不包括渲染输入)完全与我为客户端定义的路由组成。
  • 当您在浏览器中输入http://localhost:7776/domaintest 时,您会收到 404 吗?
  • @KarlP.Galvez 没有。它工作得很好——另一方面,正如我上面提到的,它没有做任何事情。
  • @ZoltánSchmidt 您的整个应用程序是否在本地主机上运行?如果是这样,请尝试 url: '/domaintest' 您可能会遇到 CORS 问题。自从我在 localhost 上进行开发以来已经有一段时间了,所以我可能要离开了。

标签: javascript jquery ajax node.js express


【解决方案1】:

经过一些研究和外部帮助,我找到了解决方案。

对于domaintest,定义了一个路由,这与我为客户端定义的几乎相同。好吧,对于domaintest 路由,我必须在router.get 之后添加下一个函数调用:

router.post('/', function(req, res) {
    res.setHeader('Content-Type', 'application/json');
    res.send(JSON.stringify({data: 'asd'}));
});

上面所谓的服务器代码实际上是没有用的,也没有必要的; domaintest 充当服务器。

【讨论】:

    【解决方案2】:

    我认为这是因为您错误地调用了body-parser。正文解析器不是 express 的一部分,所以你不能这样做 express.bodyParser

    你需要像这样包含它:

    var bodyParser = require('body-parser);
    app.use(bodyParser.urlencoded({ extended: false }))
    

    【讨论】:

    • 这可能是真的,但根据 Opera Dragonfly 的说法,它甚至没有到达代码的那部分。 jquery-1.6.2.min.js:18 POST http://localhost:7776/domaintest 404 (Not Found)
    【解决方案3】:

    将您的 server.js 文件更改为此。我还没有测试过代码,但这应该可以工作。

        var express = require('express');
            var app = express.createServer();
            var router = express.Router();
    
            app.use(express.bodyParser());
    
    
        router.post('/domaintest', function(req, res, next) {
          var obj = {};
                console.log('body: ' + JSON.stringify(req.body));
                res.send(req.body);
        });
    
    app.listen(7776);
    

    您可以阅读本文以获取更多信息http://adrianmejia.com/blog/2014/10/01/creating-a-restful-api-tutorial-with-nodejs-and-mongodb/

    【讨论】:

    • @ZoltánSchmidt 有什么错误吗?你能调试它吗?
    • jquery-1.6.2.min.js:18 POST http://localhost:7776/domaintest 404 (Not Found) 根据 Opera Dragonfly。
    • 完整流程:send @ jquery-1.6.2.min.js:18 -> f.extend.ajax @ jquery-1.6.2.min.js:18 -> (anonymous function) @ index:9 -> f.event.handle @ jquery-1.6.2.min.js:17 -> i.handle.k @ jquery-1.6.2.min.js:16
    • 更具体地说,index:9$.ajax 发生的地方。
    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2023-03-20
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多