调用一个 Nodejs nodeapi 始终没有返回对象

发布于 1周前 作者 itying888 来自 nodejs/Nestjs

调用一个 Nodejs nodeapi 始终没有返回对象

来实现页面截屏功能,为了避免重复截屏就加入了锁。不知道是哪个环节有问题,求大牛看看。。

router.post('/shot', function(req, res) {
  var token = req.param('token'); 
  var url = req.param('url', false);

  debug('url : ' + url);
  if (!url) { res.send('must with url') }
  url = decodeURIComponent(url);
  var filename = '';
  var uri = new URI(url);
  uri.search(function(data){
    filename = data['preview_theme_id'] + '.png';
  });

  var mongo = req.mongo;
  var collection = mongo.collection('web_shots');
  collection.findOne({'url_md5':filename}, function(err, doc){
    if(!err && doc){
      debug(JSON.stringify(doc));
      return res.send(doc.content);
    } else {
      debug('filename: ', filename);
      mongo.collection('web_shots_lock').findOne({'url_md5':filename},function(err,doc){
        if(!doc)  { 
          mongo.collection('web_shots_lock').save({url_md5:filename,created_at:new Date()},{w:1},function(){
            shot.shot(url, function (err, data) {
              if(!err && data) {
                mongo.collection('web_shots').save({url_md5:filename,content:data,created_at:new Date()},{w:1},function(){
                  debug('update success!');
                  mongo.collection('web_shots_lock').findAndRemove({url_md5:filename},function(){});
                });
              } else {
                mongo.collection('web_shots_lock').findAndRemove({url_md5:filename},function(){});
              }
            });
          });
          return res.status(201).end();
        }
      });
      return res.status(202).end();
    }
  });
});

6 回复

天哪,原来不止我一个人用 nodejs 写接口,代码这么乱

你们都是这样吗,一点集成、封装都没。。我以为我写的够糙快猛了


我刚到公司实习,然后写 nodejs 的人被挖走了,就只能自己看他的代码,借口出问题不知道是哪儿。。。

这样贴代码很难定位的,看你也打了 debugger 。爱莫能助,推荐个调试工具 npm install devtool 吧。。

if(!doc) 没有 else 。。。

不知道你指的那个 api 。但我看到你的 function 都是异步的,哪会有 return ?

在调用 Node.js 的 nodeapi 而没有返回对象时,可能有几个潜在的原因。以下是一些常见的排查步骤和可能的解决方案:

  1. 检查 API 调用代码: 确保你正确调用了 API 并处理了返回的数据。以下是一个基本的示例,展示如何调用一个返回 JSON 对象的 API:

    const axios = require('axios');
    
    async function fetchData() {
      try {
        const response = await axios.get('http://example.com/nodeapi');
        console.log(response.data); // 应该输出返回的对象
      } catch (error) {
        console.error('Error fetching data:', error);
      }
    }
    
    fetchData();
    
  2. 错误处理: 确保你捕获了所有可能的错误。上面的示例中使用了 try...catch 来处理错误。

  3. 检查 API 服务端: 确认 nodeapi 服务端是否正确返回了数据。你可以使用工具如 Postman 或 curl 来测试 API。

  4. 网络问题: 检查网络连接是否稳定,API 是否可达。

  5. 返回类型: 确认 API 是否确实返回了一个对象。有时 API 可能返回其他类型的数据(如数组、字符串等)。

  6. 调试: 使用 console.log 或调试工具来检查调用过程中的变量和状态。

如果以上步骤都无法解决问题,可能需要更详细地检查 API 的实现或咨询 API 的提供者。

回到顶部