在AJAX发布请求后将数据返回给客户端?

时间:2015-11-21 15:19:11

标签: jquery ajax node.js google-chrome-extension

我正在尝试从我的chrome扩展程序向我的node.js服务器发送POST请求,然后让服务器将JS文件发送回我的扩展程序。这样做的最佳方式是什么?

目前尝试了这个:

Server.js

function sendJSfile(req, res) {
    var body = req.body.apples
    console.log(body)

    if (body.length >= 3) {
        console.log("Long!")
    } else{
        console.log("Short!")
        res.writeHead(200, {"Content-Type": "text/javascript"});
        fs.createReadStream("./manual.js").pipe(res);
    }
}

Client.js

     request("https://61d6b1ac.ngrok.io/api/panels/hitme", "post", "JSON", {apples})
    .done(function(res){
      console.log(res)

    })
  })

 function request(url, method, dataType, data){
  return $.ajax({
  url: url,
  method: method,
  dataType: dataType,
  data: data
   })
  }

1 个答案:

答案 0 :(得分:0)

我可以注意到的一件事是你已经编写了AJAX以从服务器接收JSON数据,但是从服务器发送内容类型为javascript,这可能不起作用。

另外根据您的问题,您希望将js文件发送回客户端。有三种方法可以做到这一点 -

  1. 您可以将JS文件的内容作为字符串发送,然后在您的ajax成功响应中执行。这是不好的方法。

  2. 您可以从NodeJS服务器发送JS文件的公共URL,然后使用<script>标记,您可以在JS中下载它。

  3. 如果您了解客户的公共JS网址,也可以使用$.getScript

  4. 就上述服务器代码而言,您可以从服务器返回JS内容,如下所示 -

        function sendJSfile(req, res) {
        var body = req.body.apples
        console.log(body)
    
        if (body.length >= 3) {
        console.log("Long!")
        // here you will need to send error or something to the request
         res.send();
        } else{
        console.log("Short!")
        res.writeHead(200, {"Content-Type": "text/javascript"});
        //fs.createReadStream("./manual.js").pipe(res);
        // if you want to send manual.js content, then this can be sent as  following
        var readStream = fs.createReadStream("./manual.js");
    
         readStream.on('open', function () {
         // This just pipes the read stream to the response object (which goes to the client)
              readStream.pipe(res);
         });
    
        // This catches any errors that happen while creating the readable stream 
           readStream.on('error', function(err) {
        res.end(err);
        });
        }
        }