Table of Contents
瀏覽器打開開發好的網頁的時候報錯:Caused by: SyntaxError: Unexpected identifier
本篇博客主要是收集一些編程時遇到的典型的代碼方面的bug,包括前端後端以及數據庫。
後端
把不必要的數據庫操作放到了for循環裏面做
一個真實發生在我們的產品裏的例子,僞代碼如下:
public ResponseEntity<List<PubCustomer>> getAllCustomer(String expand, String q, Integer pageSize,Integer pageNumber, String... sortBy) {
...
Iterable<BP> bpCustomer = bpRepository.findAll(queryConditions, pageRequest);
...
if (bpCustomer != null) {
bpCustomer.forEach(bp -> {
...
if (allExpandParamStatus.get(DEFAULT_ADDRESS) || allExpandParamStatus.get("all")) {
Address defauleAddress = addressRepository.findByOwnerIdAndIsDefault(bp.getPkId(), true);
customer.setDefaultAddress(defauleAddress);
}
customers.add(customer);
});
}
...
}
問題出在forEach循環裏的一個方法調用了一個數據庫操作的方法findByOwnerIdAndIsDefault(), 如果拿回來了1000個客戶信息,那麼這裏就會操作數據庫1000次.
nested exception is java.lang.IllegalArgumentException: Token (spring.cloud.vault.token) must not be empty
項目爲spring boot項目,使用了vault,在啓動時報了上述錯誤。原因在於在src/main/resources目錄下只添加了application.properties而沒有添加BootStrap.properties.
Spring Cloud Configuration集成使用boostrap上下文進行配置。 在啓動應用程序上下文之前配置引導上下文,以便配置集成可以加載和初始化隨後在應用程序上下文中使用的PropertySource。
因此添加bootstrap.properties文件,並加上屬性spring.cloud.vault.token即可。
前端
瀏覽器打開開發好的網頁的時候報錯:Caused by: SyntaxError: Unexpected identifier
這個錯誤一般都是由於javascript少寫了逗號或者括號導致的,需要仔細排查。
數據庫
mongodb排序問題
在使用mongodb數據庫查詢數據並排序時,遇到一個bug:
Error: error: {
"$err" : "Executor error: Overflow sort stage buffered data usage of 33558548 bytes exceeds internal limit of 33554432 bytes",
"code" : 17144
}
查閱資料之後發現這是因爲mongodb排序有一個限制,即: 參與sort的數據的size最大不能超過32MB限制。
在我的代碼中,採取瞭如下措施,
- 對查詢加入了filter
- 發現返回的數據本身就是根據時間排序的,於是直接去掉了sort
事實上針對大多數的情況,可以採取如何兩種方式解決
- 加入正確的索引
- 修改默認配置,擴大內存