MongoDB存ISO 3166格式国家名:航班系统城市名转三字码实现问题
实现方案
首先先明确:你提到的i18n-iso-countries是用于转换国家ISO标准二/三字码的工具,无法直接生成SYD、NYC这类IATA机场/城市三字码,以下是两种最适配你现有代码的实现方式:
方案1:直接扩展现有配置(最简单,适配你当前固定目的地列表的场景)
你当前的目的地是硬编码的固定数组,直接给每个选项添加对应的编码字段即可,无需引入额外依赖:
- 修改
destinations数组,添加对应编码:
const destinations = [ { title: "Sydney", code: "SYD" }, { title: "Paris", code: "PAR" }, { title: "Thailand", code: "TH" }, { title: "France", code: "FR" }, { title: "Dhaka", code: "DAC" }, { title: "Bangkok", code: "BKK" }, { title: "Indonesia", code: "ID" }, ];
- 修改Autocomplete组件的onChange逻辑,直接存储编码到formData:
// 出发地的onChange修改为 onChange={(event, value) => setFormData({ ...formData, from: value.code }) } // 目的地的onChange同步修改为 onChange={(event, value) => setFormData({ ...formData, to: value.code }) }
这种方式无需额外处理,提交时formData里的from/to已经是目标编码,直接存入MongoDB即可,你的Mongoose Schema不需要做任何修改。
方案2:动态转码(适配后续目的地会动态新增的场景)
如果后续目的地列表是动态获取的,不是固定值,可以引入对应转码包实现自动转换:
处理IATA城市/机场码
安装airport-codes包:npm install airport-codes
在表单组件顶部导入并封装转换方法:
import airports from 'airport-codes'; // 城市名转IATA码,找不到则返回原名兜底 const getIataCode = (cityName) => { const match = airports.find({ city: cityName }).first(); return match ? match.iata : cityName; }
处理国家ISO码
如果是国家名称转换,就用你提到的i18n-iso-countries包:
安装:npm install i18n-iso-countries
导入并封装方法:
import countries from 'i18n-iso-countries'; import enLocale from 'i18n-iso-countries/langs/en.json'; countries.registerLocale(enLocale); // 国家名转ISO二字码,找不到返回原名兜底 const getCountryCode = (countryName) => { return countries.getAlpha2Code(countryName, 'en') || countryName; }
提交时统一转码
修改handleSubmit方法,在提交前对from/to字段做转码处理:
const handleSubmit = () => { const processedData = { ...formData, from: getIataCode(formData.from) || getCountryCode(formData.from), to: getIataCode(formData.to) || getCountryCode(formData.to), return: formData.tripType === "One Way" ? "None" : formData.return }; // 这里把processedData提交到后端存入MongoDB即可 console.log(processedData); };
内容的提问来源于stack exchange,提问作者buzz
相关产品推荐
相关产品推荐

