在Android中改造2将导致Java.io.EOFException在通过Node.js查询来自MongoDB数据库的项目时

我一直在尝试使用Retrofit 2在Android项目中一次从mLab以JSONArray的forms查询多个MongoDB文档。 我试图查询的文档在其中一个字段中具有相同的值,所以我在我的Node.js API中使用了db.collection.find()方法。 这是Android应用程序代码。

productSubscription.add(ProductNetworkUtil .getProductRetrofit(myToken).getProductByCategory("Hardware") .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(this::handleProductListResponse,this::handleProductError)); private void handleProductResponse(Product product) { String itemName = product.getItemName(); Snackbar.make(findViewById(R.id.content_home_screen), itemName, Snackbar.LENGTH_LONG).show(); int stop = 0; } private void handleProductListResponse(JSONArray productList) { Snackbar.make(findViewById(R.id.content_home_screen),"Hardware list received",Snackbar.LENGTH_SHORT).show(); int stop = 0; } private void handleProductError(Throwable error) { if(error instanceof HttpException) { Gson gson = new GsonBuilder().create(); try { String errorBody = ((HttpException)error).response().errorBody().string(); Response response = gson.fromJson(errorBody,Response.class); Snackbar.make(findViewById(R.id.content_home_screen),response.getMessage(),Snackbar.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } else { Snackbar.make(findViewById(R.id.content_home_screen),"Network Error!",Snackbar.LENGTH_SHORT).show(); } } 

这里是前面的代码片段中使用的ProductNetworkUtil类,

 public class ProductNetworkUtil { public static Retrofit2ProductInterface getProductRetrofit(String token) { OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); httpClient.addInterceptor(chain -> { Request original = chain.request(); Request.Builder builder = original.newBuilder() .addHeader("x-access-token", token) .method(original.method(),original.body()); return chain.proceed(builder.build()); }); RxJavaCallAdapterFactory rxAdapter = RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()); return new Retrofit.Builder() .baseUrl(NewLoginConstants.PRODUCT_FETCHER_URL) .client(httpClient.build()) .addCallAdapterFactory(rxAdapter) .addConverterFactory(GsonConverterFactory.create()) .build().create(Retrofit2ProductInterface.class); }} 

这里是我一直使用的接口类:

 enter cpublic interface Retrofit2ProductInterface { @GET("products/{itemName}") Observable<Product> getProduct(@Path("itemName") String itemName); @GET("products/{category}") Observable<JSONArray> getProductByCategory(@Header("category") String category);} 

如果我要使用itemName字段作为参数的查询方法,我可以查询成功,因为在数据库中每个文档的itemName是唯一的。 但是,getProductByCategory方法会导致Java.io.EOFException:debugging器中行1列1path$的input结束。 我search了一些答案,有人说这是由于应用程序收到空的数据。 所以我试图改变node.js代码。

  exports.getProductByCategory = category => new Promise ((resolve,reject) => { var productList = product.find({ category: category }, { _id: 1, QRCode: 1, owner: 1, itemName: 1, salePrice: 1, price: 1, sku: 1, webCode: 1, summary: 1, description: 1, inTheBox: 1, warranty: 1, category: 1, mainImg: 1, otherImgs: 1 }).toArray(); product.resolve({productList, message: 'Got your list!'}) .catch(err => reject({ status: 500, message: 'Internal Server Error !' })) }); 

以下是node.js API的routes.js中的相关代码

 'use strict'; 

const detail = require('./ functions / detail'); const config = require('./ config / config.json');

module.exports = router => {

 router.get('/', (req, res) => res.end('This is the product node!')); router.get('/products/:id', (req,res) => { detail.getProduct(req.params.id) .then(result => res.json(result)) .catch(err => res.status(err.status).json({ message: err.message })); }); router.get('/products/:category', (req,res) => { detail.getProductByCategory(req.params.category) .then(result => res.json(result)) .catch(err => res.status(err.status).json({message: err.message})); }); 

}

我不知道如果node.js API有一些基本的编码错误,或者是android查询方法是问题。

我不能说任何事情,因为我需要更多的信息,并自己检查(您的回复数据)。

你有没有尝试debugging/logging和检查什么是响应内容? 看起来这是错的。