Получение дубликатов результатов на конечной точке API Express. Как мне сбросить поиск, чтобы каждый раз получать новые результаты? - PullRequest
0 голосов
/ 30 апреля 2020

Я использую Express для создания конечной точки, чтобы я мог получить к ней доступ через вызовы API. Когда я выполняю поиск в первый раз, все работает отлично, но если я делаю это снова, я получаю результаты предыдущего времени, а также результаты нового поиска. Как получить результаты поиска для сброса каждый раз?

Вот ссылка на фактическую конечную точку: (замените слово «covid» для любого поискового запроса, и если вы сделаете это по крайней мере дважды, вы данные вашего последнего поиска будут отображаться даже после того, как вы выполните новый поиск)

https://laffy.herokuapp.com/search/covid

Большое спасибо за любую помощь, которую вы можете предложить!

Это файл приложения. js, который вызывает twitterRouter и с помощью app.use создает конечную точку в / search /: searchTerm:

app. js

const createError = require('http-errors');
const express = require('express');
const path = require('path');
const indexRouter = require('./routes/index');
const twitterRouter = require('./routes/twitterCall.js');
const top20 = require('./routes/twitterTop20.js');
const app = express();

app.set('views', path.join(__dirname, 'views'));
// app.set('port', process.env.PORT || 3001);

app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);

//creates route to use search at /search/
app.use('/search/:searchTerm', twitterRouter.search);
//creates route to access to get the top 20 Twitter hashtags trending
app.use('/top20', top20); 

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

У меня сложилось впечатление, что использование res.send () завершает поиск API, но, похоже, это не конец.

Тогда вот фактический вызов API и где он генерирует данные для конечной точки:

twitterCall. js

//twitter file that searchs for tweets specified in params.q

var Twitter = require('twitter');
var config = require('../config/config.js');
var express = require('express');
var router = express.Router();


var T = new Twitter(config);
var locationsToSend = [];

exports.search = (req, res) => {
    if (req.body == null) {
        res.status(404).send( {
            message: "Search can not be blank"
        })
    }
    var params = {
        q: req.params.searchTerm,
        count: 1000,
        result_type: 'recent',
        lang: 'en'
    }


//Initiate your search using the above parameters
T.get('search/tweets', params, function(err, data, response) {
    //if there is no error, proceed
  if(!err){
   // Loop through the returned tweets
    for(let i = 0; i < data.statuses.length; i++){


      if (data.statuses[i].user.location!==null && data.statuses[i].user.location!=="") {
        locationsToSend.push({
          id: data.statuses[i].id_str, 
          createdAt: data.statuses[i].created_at,
          text: data.statuses[i].text,
          name: data.statuses[i].user.screen_name,
          location: data.statuses[i].user.location
        });
      }

    }
    res.send(locationsToSend);

  } else {
    console.log(err);
    return res.status(404).send({
                message: "error searching " + err
            });


  }
});


};

1 Ответ

2 голосов
/ 30 апреля 2020

Ваша переменная locationsToSend находится в глобальной области видимости, которая сохраняется, пока ваше приложение express работает. Вы должны инициализировать эту переменную внутри обратного вызова search/tweets, и вы получите желаемое поведение. Таким образом, каждый запрос будет работать с собственным locationsToSend, а не с глобальным.

...